查看原文
其他

改善查询执行延迟

DFINITY Internet Computer 2024-04-02



背景
互联网计算机可以托管完整的 dapp - 前端、后端和数据,用户可以将他们的 dapp 部署为容器(智能合约)。
就像 HTTP POSTGET 方法一样,互联网计算机协议支持两种类型的消息:更新和查询,更新消息在所有子网节点上执行并保留容器状态更改,查询消息会丢弃状态更改,并且通常在单个节点上运行。
Web 缓存是一种众所周知的技术,可以加速请求并减少服务器峰值负载,然而,常见的缓存挑战是数据一致性,而去中心化的 Web3 世界则将门槛提高得更高。
继续阅读以了解互联网计算机如何实现副本内查询缓存。
查询缓存属性
互联网计算机实现了具有以下功能的副本内查询缓存:
  • 透明性:缓存完全透明,无需担心缓存有效性、最大寿命等问题。

  • LRU 缓存替换策略:查询缓存首先丢弃最近最少使用(LRU)条目,当缓存命中有效条目时,该条目将成为最近使用的条目,一段时间内未使用的条目会变得最近很少使用,并最终从缓存中逐出。

  • 缓存有效性:该实现确保对于给定的复制状态,任何有效的缓存条目都包含查询执行的最新结果。

缓存有效性是查询缓存实现的主要挑战,所以让我们进一步深入研究!
缓存失效因素
缓存有效性是指缓存的结果与实际查询执行的结果相匹配。
查询缓存是一个键值映射,其中每个键都是一个元组(source, receiver, method, payload),值是查询执行的结果,当所有 4 个关键组件都匹配时,就会发生缓存命中。
但即使有命中,缓存的结果仍然是最新的吗?结果可能会在以下情况后变得陈旧:
  • 状态更改:更新调用或容器升级会更改状态,因此缓存的结果不再是最新的。

  • Cycle 余额和系统时间:容器会定期对 CPU 和内存资源、执行、入口消息等进行收费,查询可能会根据特定的余额级别或在特定的时间点采用不同的执行路径,因此,如果容器余额或系统时间发生变化,缓存条目就会变得陈旧。


考虑到许多变化的因素和实时数据的新鲜度属性,数据可能会过快地过时而无法实现高查询缓存效率,事实上,2023 年 5 月发布的查询缓存的最初实现就是这样。
初始版本的缓存命中率约为 10%,大多数时候,缓存会因为 Cycle 余额和系统时间变化而失效,还有改进的空间吗?
改进缓存失效
改善缓存失效的一种方法是确定查询执行是否依赖于 Cycle 余额和系统时间:
  • 查询执行不会修改区块链状态:此互联网计算机属性允许以任何顺序执行查询并缓存其执行结果。

  • 查询执行是确定性的:只要状态、Cycle 余额和系统时间相同,执行结果始终相同,此属性对于查询缓存也至关重要。

  • 跟踪查询执行:系统可以监视查询是否尝试读取当前 Cycle 余额或系统时间。

  • 忽略缓存失效:由于大多数查询从不读取余额和时间,因此即使余额或时间发生变化,它们的缓存结果仍然有效。

结果
通过查询执行跟踪,缓存命中率从 10% 左右提高到 50%:


此外,中值查询延迟也从 1.2 毫秒左右降低到 0.4 毫秒,当缓存命中率达到 50% 以上时,中位数将下降至仅 0.1 毫秒:


要点:如何改善查询延迟?


开发人员可以按照这些提示进一步提高查询的缓存效率。
1. 避免不必要地调用 time()balance() 系统 API:


2. 尝试将系统 API 调用移至实际使用的地方:


新功能是透明的,并且可在所有子网和本地开发环境中使用。
参考
互联网计算机查询缓存实现的源代码:github.com/dfinity/ic
互联网计算机接口规范:节点间的同步性
如果您有疑问/建议或只是想与互联网计算机开发人员和 DFINITY 工程师见面,请加入 forum.dfinity.org。


作者:Andriy Berestovskyy翻译:Catherine

-              -


The ICP.Hubs of Asia

宣布推出 DAO Adventure(Motoko 课程)

Web3 玩家:1 万亿 Notcoins 挖矿,Neopets 遇上 ICP,Trickshot Blitz 太棒了





你关心的 IC 内容

技术进展 | 项目信息 | 全球活动



长按关注 IC 微信公众号

掌握最新资讯


*添加小助手微信 comiocn 进交流社群


继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存